#define EVENT_DIE 0x08 /* OS is about to be killed. Clean up please! */
#define EVENT_NET_TX 0x10 /* packets for transmission. */
#define EVENT_NET_RX 0x20 /* empty buffers for receive. */
-#define EVENT_NET2_TX 0x40 /* packets for transmission. */
-#define EVENT_NET2_RX 0x80 /* empty buffers for receive. */
-
-/* should these macros and the ones below test for range violation? */
-#define EVENT_NET_TX_FOR_VIF(x) (EVENT_NET_TX << (2 * x))
-#define EVENT_NET_RX_FOR_VIF(x) (EVENT_NET_RX << (2 * x))
-
/* Bit offsets, as opposed to the above masks. */
#define _EVENT_BLK_TX 0
#define _EVENT_DIE 3
#define _EVENT_NET_TX 4
#define _EVENT_NET_RX 5
-#define _EVENT_NET2_TX 6
-#define _EVENT_NET2_RX 7
-#define _EVENT_NET_TX_FOR_VIF(x) (_EVENT_NET_TX + (2 * x))
-#define _EVENT_NET_RX_FOR_VIF(x) (_EVENT_NET_RX + (2 * x))
/*
* NB. We expect that this struct is smaller than a page.
#define rtnl_unlock() ((void)0)
#define dst_init() ((void)0)
+#if 1
+#define DPRINTK(_f, _a...) printk(_f , ## _a)
+#else
+#define DPRINTK(_f, _a...) ((void)0)
+#endif
+
// Ring defines:
#define TX_RING_INC(_i) (((_i)+1) & (TX_RING_SIZE-1))
#define RX_RING_INC(_i) (((_i)+1) & (RX_RING_SIZE-1))
__flush_tlb();
if ( net_ring->rx_cons == net_ring->rx_event )
- set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events);
+ set_bit(_EVENT_NET_RX, &s->events);
}
}
}
net_ring->rx_cons = (i+1) & (RX_RING_SIZE-1);
if ( net_ring->rx_cons == net_ring->rx_event )
- set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events);
+ set_bit(_EVENT_NET_RX, &s->events);
}
kfree_skb(skb);
}
if ( ((tx.addr & ~PAGE_MASK) + tx.size) >= PAGE_SIZE )
{
- printk("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size,
+ DPRINTK("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size,
(tx.addr &~PAGE_MASK) + tx.size);
continue;
//BUG();
}
if ( TX_RING_INC(i) == net_ring->tx_event )
- set_bit(_EVENT_NET_TX_FOR_VIF(j), &shared->events);
+ set_bit(_EVENT_NET_TX, &shared->events);
/* Map the skb in from the guest, and get it's delivery target.
* We need this to know whether the packet is to be sent locally
#define NET_TX_IRQ _EVENT_NET_TX
#define NET_RX_IRQ _EVENT_NET_RX
-#define NET_TX_IRQ_FOR_VIF(x) _EVENT_NET_TX_FOR_VIF(x)
-#define NET_RX_IRQ_FOR_VIF(x) _EVENT_NET_RX_FOR_VIF(x)
-
#define TX_MAX_ENTRIES (TX_RING_SIZE - 2)
#define RX_MAX_ENTRIES (RX_RING_SIZE - 2)
{
struct net_private *np = dev->priv;
int error = 0;
- char *rxlabel, *txlabel;
-
- // This is inevitably not the right way to allocate a couple of static strings.
- rxlabel = kmalloc(sizeof("net-rx- "), GFP_KERNEL);
- txlabel = kmalloc(sizeof("net-tx- "), GFP_KERNEL);
- if ((rxlabel == NULL) || (txlabel == NULL)) goto fail;
- sprintf(rxlabel, "net-rx-%d", np->id);
- sprintf(txlabel, "net-tx-%d", np->id);
-
+
np->rx_idx = np->tx_idx = np->tx_full = 0;
memset(&np->stats, 0, sizeof(np->stats));
network_alloc_rx_buffers(dev);
- error = request_irq(NET_RX_IRQ_FOR_VIF(np->id), network_rx_int, 0,
- rxlabel, dev);
+ error = request_irq(NET_RX_IRQ, network_rx_int, 0,
+ "net-rx", dev);
if ( error )
{
printk(KERN_WARNING "%s: Could not allocate receive interrupt\n",
goto fail;
}
- error = request_irq(NET_TX_IRQ_FOR_VIF(np->id), network_tx_int, 0,
- txlabel, dev);
+ error = request_irq(NET_TX_IRQ, network_tx_int, 0,
+ "net-tx", dev);
if ( error )
{
printk(KERN_WARNING "%s: Could not allocate transmit interrupt\n",
dev->name);
- free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev);
+ free_irq(NET_RX_IRQ, dev);
goto fail;
}
return 0;
fail:
- if ( rxlabel ) kfree(rxlabel);
- if ( txlabel ) kfree(txlabel);
if ( np->net_ring->rx_ring ) kfree(np->net_ring->rx_ring);
if ( np->net_ring->tx_ring ) kfree(np->net_ring->tx_ring);
if ( np->rx_skb_ring ) kfree(np->rx_skb_ring);
//print_range(skb->data + ETH_HLEN + 8, 20);
//printk("skb->len is %u in guestOS (expected fraglen: %u).\n", skb->len, skb->len - (ETH_HLEN + 8));
i = np->net_ring->tx_prod;
+
+ if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE )
+ {
+ struct sk_buff *new_skb = alloc_skb(RX_BUF_SIZE, GFP_KERNEL);
+ skb_put(new_skb, skb->len);
+ memcpy(new_skb->data, skb->data, skb->len);
+ kfree_skb(skb);
+ skb = new_skb;
+ }
+
np->tx_skb_ring[i] = skb;
np->net_ring->tx_ring[i].addr
= (unsigned long)phys_to_machine(virt_to_phys(skb->data));
struct net_private *np = dev->priv;
netif_stop_queue(dev);
- free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev);
- free_irq(NET_TX_IRQ_FOR_VIF(np->id), dev);
+ free_irq(NET_RX_IRQ, dev);
+ free_irq(NET_TX_IRQ, dev);
network_free_rx_buffers(dev);
kfree(np->net_ring->rx_ring);
kfree(np->net_ring->tx_ring);